const express = require("express"); // 引入express库建服务器
const path = require("path");
const cors = require("cors"); //cors库是express库的中间件，解决跨域问题。
const {expressjwt : jwt} = require("express-jwt");
require("./db.js"); // 引入db.js完成数据库连接

const app = express();
const PORT = 8000;

app.use(cors()); // 加载cors中间件
app.use(express.json()); // 加载express自带的json中间件，解析json格式请求体的数据放在req的body属性中。
app.use(express.urlencoded({ extended: false}));


// 加载静态资源，如果不需要验证token要写在使用jwt认证前。
app.use("/static/headphoto", express.static(path.join(__dirname, 'static/headphoto')));
app.use("/static/photo", express.static(path.join(__dirname, "static/photo")));
app.use("/static/cover", express.static(path.join(__dirname, "static/cover")));

// 使用 express-jwt 验证用户是否传递 token
app.use(
    jwt({ secret: 'HCS_come_on_baby', algorithms: ['HS256'] }).unless({
        path: ["/api/user/login" , '/api/user/register'],
    })
)

// 引入和使用路由
const userRouter = require("./router/user.js");
const diaryItemRouter = require("./router/diaryItems");
const diarybookRouter = require("./router/diarybook");
const replyRouter = require("./router/reply.js");
const imguploadRouter = require("./router/imgupload.js");
const timecapsuleRouter = require("./router/timeCapsule.js");
const remindRouter = require("./router/remind.js");

app.use("/api", userRouter);
app.use("/api/diaryItem", diaryItemRouter);
app.use("/api/diarybook", diarybookRouter);
app.use("/api/reply" , replyRouter);
app.use("/api/imgupload" , imguploadRouter);
app.use("/api/timecapsule" , timecapsuleRouter);
app.use("/api/remind" , remindRouter);


// 捕获所有路径都不匹配的情况 -> 404
app.all('*', function (req, res) {
    res.send({
        code: 404,
        msg: 'page not found!',
        data: null,
    })
})

// 错误处理
// 在正常情况下，无法接收到异步请求的错误(promise,async)
app.use(function (err, req, res, next) {
    console.log('error name: ', err.name);
    console.log('error message: ', err.message);
    console.log('error status: ', err.status);

    if (err.status === 401) {
        return res.send({
            code: 401,
            msg: '登陆已过期!请重新登录',
            data: null,
        })
    }

    res.send({
        code: 500,
        msg: '服务端错误',
        data: null,
    })
})

app.listen(PORT , ()=>{
    console.log(`server run in http://localhost:${PORT}`);
})